package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

type Counter struct {
	m sync.Mutex
	n uint64
}

func (c *Counter) Value() uint64 {
	c.m.Lock()
	defer c.m.Unlock()
	return c.n

}

func (c *Counter) Increase(dalta uint64) {
	c.m.Lock()
	defer c.m.Unlock()
	c.n += dalta

}

func main() {
	t := time.Now()
	var c Counter
	for i := 0; i < 100; i++ {
		go func() {
			for k := 0; k < 100; k++ {
				c.Increase(1)
			}
		}()
	}

	for c.Value() < 10000 {
		runtime.Gosched() // 让出主 goroutine 的执行权，使用这种方式，程序的执行时间更短
		//fmt.Println(777)
	}

	fmt.Println(c.Value())
	fmt.Println(time.Now().Sub(t))

}

/*
不使用 Gosched 函数
	777
	777
	777
	10000
	1.50725ms

使用 Gosched 函数
感觉相差也不多

*/
